package ru.bytedog.oiot.counter.bot.service;

import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import ru.bytedog.oiot.counter.bot.bean.oiot.IOiotResponse;
import ru.bytedog.oiot.counter.bot.bean.oiot.OiotErrorResponse;
import ru.bytedog.oiot.counter.bot.bean.oiot.OiotSuccessResponse;
import ru.bytedog.oiot.counter.bot.entity.BotUser;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * Сервис взаимодействия с API OIOT.RU
 */
@Slf4j
@Service
public class OiotIntegrationService {

    protected static final DateTimeFormatter DATE_PARAM_FORMATTER = DateTimeFormatter.ofPattern("dd-MM-yyyy");
    protected static final String ERROR_MESSAGE = "Не удалось получить ответ от сервиса";
    protected static final String PARAM_ID = "id";
    protected static final String PARAM_TOKEN = "token";
    protected static final String PARAM_DATE = "date";

    private final RestTemplate service;
    private final Gson jsonMapper;

    public OiotIntegrationService(RestTemplate service, Gson jsonMapper) {
        this.service = service;
        this.jsonMapper = jsonMapper;
    }

    /**
     * Получить последние показания счетчиков пользователя
     *
     * @param user информация о пользователе
     * @return ответ от сервиса
     */
    public IOiotResponse loadUserLastCounterValue(BotUser user) {
        log.debug("Запрос данных с сервиса OIOT.RU пользователем {}", user.getUsername());
        Map<String, Object> params = new HashMap<>();
        params.put(PARAM_ID, user.getOiotUserId());
        params.put(PARAM_TOKEN, user.getOiotUserToken());
        params.put(PARAM_DATE, LocalDate.now().format(DATE_PARAM_FORMATTER));
        String result = service.getForEntity("https://oiot.ru/api/v1/?id={id}&token={token}&date={date}", String.class, params)
                .getBody();
        log.debug("Ответ от сервиса OIOT.RU: {}", result);
        if (StringUtils.isBlank(result)) {
            return new OiotErrorResponse(Collections.singletonList(ERROR_MESSAGE));
        }
        if (result.contains("\"errors\":")) {
            return jsonMapper.fromJson(result, OiotErrorResponse.class);
        }
        return jsonMapper.fromJson(result, OiotSuccessResponse.class);
    }
}
